'\" te
.\" Copyright (c) 2007, Sun Microsystems, Inc.  All Rights Reserved.
.\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
.\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
.TH PAPIJOBSUBMIT 3PAPI "Sep 10, 2013"
.SH NAME
papiJobSubmit, papiJobSubmitByReference, papiJobValidate, papiJobStreamOpen,
papiJobStreamWrite, papiJobStreamClose, papiJobQuery, papiJobModify,
papiJobMove, papiJobCancel, papiJobHold, papiJobRelease, papiJobRestart,
papiJobPromote, papiJobGetAttributeList, papiJobGetPrinterName, papiJobGetId,
papiJobGetJobTicket, papiJobFree, papiJobListFree \- job object manipulation
.SH SYNOPSIS
.LP
.nf
cc [ \fIflag\fR\&.\|.\|. ] \fIfile\fR\&.\|.\|. \fB-lpapi\fR [ \fIlibrary\fR\&.\|.\|. ]
#include <papi.h>

\fBpapi_status_t\fR \fBpapiJobSubmit\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBpapi_attribute_t **\fR\fIjob_attributes\fR,
     \fBpapi_job_ticket_t *\fR\fIjob_ticket\fR, \fBchar **\fR\fIfiles\fR,
     \fBpapi_job_t *\fR\fIjob\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobSubmitByReference\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBpapi_attribute_t **\fR\fIjob_attributes\fR,
     \fBpapi_job_ticket_t *\fR\fIjob_ticket\fR, \fBchar **\fR\fIfiles\fR,
     \fBpapi_job_t *\fR\fIjob\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobValidate\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBpapi_attribute_t **\fR\fIjob_attributes\fR,
     \fBpapi_job_ticket_t *\fR\fIjob_ticket\fR, \fBchar **\fR\fIfiles\fR,
     \fBpapi_job_t *\fR\fIjob\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobStreamOpen\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBpapi_attribute_t **\fR\fIjob_attributes\fR,
     \fBpapi_job_ticket_t *\fR\fIjob_ticket\fR, \fBpapi_stream_t *\fR\fIstream\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobStreamWrite\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBpapi_stream_t\fR \fIstream\fR, \fBvoid *\fR\fIbuffer\fR, \fBsize_t\fR \fIbuflen\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobStreamClose\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBpapi_stream_t\fR \fIstream\fR, \fBpapi_job_t *\fR\fIjob\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobQuery\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR, \fBchar **\fR\fIrequested_attrs\fR,
     \fBpapi_job_t *\fR\fIjob\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobModify\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR,
     \fBpapi_attribute_t **\fR\fIattributes\fR, \fBpapi_job_t *\fR\fIjob\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobMove\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR, \fBchar *\fR\fIdestination\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobCancel\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobHold\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobRelease\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobRestart\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
.fi

.LP
.nf
\fBpapi_status_t\fR \fBpapiJobPromote\fR(\fBpapi_service_t\fR \fIhandle\fR,
     \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
.fi

.LP
.nf
\fBpapi_attribute_t **\fR\fBpapiJobGetAttributeList\fR(\fBpapi_job_t\fR \fIjob\fR);
.fi

.LP
.nf
\fBchar *\fR\fBpapiJobGetPrinterName\fR(\fBpapi_job_t\fR \fIjob\fR);
.fi

.LP
.nf
\fBint32_t\fR \fBpapiJobGetId\fR(\fBpapi_job_t\fR \fIjob\fR);
.fi

.LP
.nf
\fBpapi_job_ticket_t *\fR\fBpapiJobGetJobTicket\fR(\fBpapi_job_t\fR \fIjob\fR);
.fi

.LP
.nf
\fBvoid\fR \fBpapiJobFree\fR(\fBpapi_job_t\fR \fIjob\fR);
.fi

.LP
.nf
\fBvoid\fR \fBpapiJobListFree\fR(\fBpapi_job_t *\fR\fIjobs\fR);
.fi

.SH PARAMETERS
.sp
.ne 2
.na
\fB\fIattributes\fR\fR
.ad
.RS 19n
a set of attributes to be applied to a printer object
.RE

.sp
.ne 2
.na
\fB\fIbuffer\fR\fR
.ad
.RS 19n
a buffer of data to be written to the job stream
.RE

.sp
.ne 2
.na
\fB\fIbufflen\fR\fR
.ad
.RS 19n
the size of the supplied buffer
.RE

.sp
.ne 2
.na
\fB\fIdestination\fR\fR
.ad
.RS 19n
the name of the printer where a print job should be relocated, which must
reside within the same print services as the job is currently queued
.RE

.sp
.ne 2
.na
\fB\fIfiles\fR\fR
.ad
.RS 19n
files to use during job submission
.RE

.sp
.ne 2
.na
\fB\fIhandle\fR\fR
.ad
.RS 19n
a pointer to a handle to be used for all PAPI operations that is created by
calling \fBpapiServiceCreate()\fR
.RE

.sp
.ne 2
.na
\fB\fIjob\fR\fR
.ad
.RS 19n
a pointer to a printer object (initialized to NULL) to be filled in by
\fBpapiJobQuery()\fR, \fBpapiJobSubmit()\fR, \fBpapiJobSubmitByReference()\fR,
\fBpapiJobValidate()\fR, \fBpapiJobStreamClose()\fR, and \fBpapiJobModify()\fR
.RE

.sp
.ne 2
.na
\fB\fIjob_attributes\fR\fR
.ad
.RS 19n
attributes to apply during job creation or modification
.RE

.sp
.ne 2
.na
\fB\fIjob_id\fR\fR
.ad
.RS 19n
ID number of the job reported on or manipulated
.RE

.sp
.ne 2
.na
\fB\fIjob_ticket\fR\fR
.ad
.RS 19n
unused
.RE

.sp
.ne 2
.na
\fB\fIjobs\fR\fR
.ad
.RS 19n
a list of job objects returned by \fBpapiPrinterListJobs()\fR or
\fBpapiPrinterPurgeJobs()\fR
.RE

.sp
.ne 2
.na
\fB\fIprinter\fR\fR
.ad
.RS 19n
name of the printer where the job is or should reside
.RE

.sp
.ne 2
.na
\fB\fIrequested_attrs\fR\fR
.ad
.RS 19n
a null-terminated array of pointers to attribute names requested during job
enumeration (\fBpapiPrinterListJobs()\fR) or job query (\fBpapiJobQuery()\fR)
.RE

.sp
.ne 2
.na
\fB\fIstream\fR\fR
.ad
.RS 19n
a communication endpoint for sending print job data
.RE

.SH DESCRIPTION
.sp
.LP
The \fBpapiJobSubmit()\fR function creates a print job containing the passed in
files with the supplied attributes.  When the function returns, the data in the
passed files will have been copied by the print service. A job object is
returned that reflects the state of the job.
.sp
.LP
The \fBpapiJobSubmitByReference()\fR function creates a print job containing
the passed in files with the supplied attributes.  When the function returns,
the data in the passed files might have been copied by the print service. A job
object is returned that reflects the state of the job.
.sp
.LP
The \fBpapiJobStreamOpen()\fR, \fBpapiJobStreamWrite()\fR,
\fBpapiJobStreamClose()\fR functions create a print job by opening a stream,
writing to the stream, and closing it.
.sp
.LP
The \fBpapiJobValidate()\fR function validates that the supplied attributes and
files will result in a valid print job.
.sp
.LP
The \fBpapiJobQuery()\fR function retrieves job information from the print
service.
.sp
.LP
The \fBpapiJobModify()\fR function modifies a queued job according to the
attribute list passed into the call.  A job object is returned that reflects
the state of the job after the modification has been applied.
.sp
.LP
The \fBpapiJobMove()\fR function moves a job from its current queue to the
named destination within the same print service.
.sp
.LP
The \fBpapiJobCancel()\fR function removes a job from the queue.
.sp
.LP
The \fBpapiJobHold()\fR and \fBpapiJobRelease()\fR functions set the job state
to "held" or "idle" to indicate whether the job is eligible for processing.
.sp
.LP
The \fBpapiJobRestart()\fR function restarts processing of a currently queued
print job.
.sp
.LP
The \fBpapiJobGetAttributeList()\fR function returns a list of attributes
describing the job. This list can be searched and/or enumerated using
\fBpapiAttributeList*()\fR calls. See \fBpapiAttributeListAddValue\fR(3PAPI).
.sp
.LP
The \fBpapiJobGetPrinterName()\fR function returns the name of the queue where
the job is currently queued.
.sp
.LP
The \fBpapiJobGetId()\fR function returns a job identifier number from the job
object passed in.
.sp
.LP
The \fBpapiJobPromote()\fR function moves a job to the head of the print queue.
.sp
.LP
The \fBpapiJobGetJobTicket()\fR function retrieves a pointer to a job ticket
associated with the job object.
.sp
.LP
The \fBpapiJobFree()\fR and \fBpapiJobListFree()\fR functions deallocate memory
allocated for the return of printer object(s) from functions that return
printer objects.
.SH RETURN VALUES
.sp
.LP
Upon successful completion, all \fBpapiJob*()\fR functions that return a value
return \fBPAPI_OK\fR. Otherwise, they return an appropriate \fBpapi_status_t\fR
indicating the type of failure.
.sp
.LP
Upon successful completion, \fBpapiJobGetAttributeList()\fR returns a pointer
to the requested data. Otherwise, it returns \fINULL\fR.
.SH EXAMPLES
.LP
\fBExample 1 \fREnumerate all jobs in a queue
.sp
.in +2
.nf
/*
 * program to enumerate queued jobs using PAPI interfaces.
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libintl.h>
#include <pwd.h>
#include <papi.h>

static int
authCB(papi_service_t svc, void *app_data)
{
    char prompt[BUFSIZ];
    char *user, *svc_name, *passphrase;

    /* get the name of the service we are contacting */
    if ((svc_name = papiServiceGetServiceName(svc)) == NULL)
            return (-1);

    /* find out who we are supposed to be */
    if ((user = papiServiceGetUserName(svc)) == NULL) {
            struct passwd *pw;

            if ((pw = getpwuid(getuid())) != NULL)
                    user = pw->pw_name;
            else
                    user = "nobody";
    }

    /* build the prompt string */
    snprintf(prompt, sizeof (prompt),
            gettext("passphrase for %s to access %s: "), user,
                  svc_name);

    /* ask for the passphrase */
    if ((passphrase = getpassphrase(prompt)) != NULL)
            papiServiceSetPassword(svc, passphrase);

    return (0);
}

/*ARGSUSED*/
int
main(int ac, char *av[])
{
    papi_status_t status;
    papi_service_t svc = NULL;
    papi_job_t *jobs = NULL;
    char *svc_name = NULL;
    char *pname = "unknown";
    int c;

    while ((c = getopt(ac, av, "s:p:")) != EOF)
        switch (c) {
        case 's':
            svc_name = optarg;
            break;
        case 'p':
            pname = optarg;
            break;
        }

    status = papiServiceCreate(&svc, svc_name, NULL, NULL, authCB,
                            PAPI_ENCRYPT_NEVER, NULL);

    if (status != PAPI_OK) {
        printf("papiServiceCreate(%s): %s\en", svc_name ? svc_name :
                     "NULL", papiStatusString(status));
        papiServiceDestroy(svc);
        exit(1);
    }

    status = papiPrinterListJobs(svc, pname, NULL, 0, 0, &jobs);
    if (status != PAPI_OK) {
        printf("papiPrinterListJobs(%s): %s\en", pname,
                    papiStatusString(status));
        papiServiceDestroy(svc);
        exit(1);
    }

    if (jobs != NULL) {
        int i;

        for (i = 0; jobs[i] != NULL; i++) {
            papi_attribute_t **list = papiJobGetAttributeList(jobs[i]);

            if (list != NULL) {
                char *name = "unknown";
                            int32_t id = 0;
                char *buffer = NULL;
                size_t size = 0;

               (void) papiAttributeListGetString(list, NULL,
                                    "printer-name", &name);
               (void) papiAttributeListGetInteger(list, NULL,
                                    "job-id", &id);
                while (papiAttributeListToString(list, "\en\et", buffer,
                            size) != PAPI_OK)
                    buffer = realloc(buffer, size += BUFSIZ);

                printf("%s-%d:\en\et%s\en", name, id, buffer);
                free(buffer);
            }
        }
        papiJobListFree(jobs);
    }

    papiServiceDestroy(svc);

    exit(0);
}
.fi
.in -2

.LP
\fBExample 2 \fRDump all job attributes.
.sp
.in +2
.nf
/*
 * program to dump a queued job's attributes using PAPI interfaces.
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libintl.h>
#include <pwd.h>
#include <papi.h>

static int
authCB(papi_service_t svc, void *app_data)
{
    char prompt[BUFSIZ];
    char *user, *svc_name, *passphrase;

    /* get the name of the service we are contacting */
    if ((svc_name = papiServiceGetServiceName(svc)) == NULL)
            return (-1);

    /* find out who we are supposed to be */
    if ((user = papiServiceGetUserName(svc)) == NULL) {
            struct passwd *pw;

            if ((pw = getpwuid(getuid())) != NULL)
                    user = pw->pw_name;
            else
                    user = "nobody";
    }

    /* build the prompt string */
    snprintf(prompt, sizeof (prompt),
            gettext("passphrase for %s to access %s: "), user,
                     svc_name);

    /* ask for the passphrase */
    if ((passphrase = getpassphrase(prompt)) != NULL)
            papiServiceSetPassword(svc, passphrase);

    return (0);
}

/*ARGSUSED*/
int
main(int ac, char *av[])
{
    papi_status_t status;
    papi_service_t svc = NULL;
    papi_job_t job = NULL;
    char *svc_name = NULL;
    char *pname = "unknown";
    int id = 0;
    int c;

    while ((c = getopt(ac, av, "s:p:j:")) != EOF)
        switch (c) {
        case 's':
            svc_name = optarg;
            break;
        case 'p':
            pname = optarg;
            break;
        case 'j':
            id = atoi(optarg);
            break;
        }

    status = papiServiceCreate(&svc, svc_name, NULL, NULL, authCB,
                            PAPI_ENCRYPT_NEVER, NULL);

    if (status != PAPI_OK) {
        printf("papiServiceCreate(%s): %s\en", svc_name ? svc_name :
                     "NULL", papiStatusString(status));
        papiServiceDestroy(svc);
        exit(1);
    }

    status = papiJobQuery(svc, pname, id, NULL, &job);
    if ((status == PAPI_OK) && (job != NULL)) {
        papi_attribute_t **list = papiJobGetAttributeList(job);

        if (list != NULL) {
            char *name = "unknown";
            int32_t id = 0;
            char *buffer = NULL;
            size_t size = 0;

            (void) papiAttributeListGetString(list, NULL,
                                    "printer-name", &name);
            (void) papiAttributeListGetInteger(list, NULL,
                                    "job-id", &id);
            while (papiAttributeListToString(list, "\en\et", buffer, size)
                            != PAPI_OK)
                buffer = realloc(buffer, size += BUFSIZ);

            printf("%s-%d:\en\et%s\en", name, id, buffer);
            free(buffer);
        }
    } else
        printf("papiJobQuery(%s-%d): %s\en", pname, id,
                    papiStatusString(status));

    papiJobFree(job);
    papiServiceDestroy(svc);

    exit(0);
}
.fi
.in -2

.LP
\fBExample 3 \fRSubmit a job (stream).
.sp
.in +2
.nf
/*
 * program to submit a job from standard input.
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libintl.h>
#include <pwd.h>
#include <papi.h>

static int
authCB(papi_service_t svc, void *app_data)
{
    char prompt[BUFSIZ];
    char *user, *svc_name, *passphrase;

    /* get the name of the service we are contacting */
    if ((svc_name = papiServiceGetServiceName(svc)) == NULL)
            return (-1);

    /* find out who we are supposed to be */
    if ((user = papiServiceGetUserName(svc)) == NULL) {
            struct passwd *pw;

            if ((pw = getpwuid(getuid())) != NULL)
                    user = pw->pw_name;
            else
                    user = "nobody";
    }

    /* build the prompt string */
    snprintf(prompt, sizeof (prompt),
            gettext("passphrase for %s to access %s: "), user,
                    svc_name);

    /* ask for the passphrase */
    if ((passphrase = getpassphrase(prompt)) != NULL)
            papiServiceSetPassword(svc, passphrase);

    return (0);
}

/*ARGSUSED*/
int
main(int ac, char *av[])
{
    papi_status_t status;
    papi_service_t svc = NULL;
    papi_stream_t stream = NULL;
    papi_job_t job = NULL;
    papi_attribute_t **attrs = NULL;
    char *svc_name = NULL;
    char *pname = "unknown";
    int id = 0;
    int c;
    int rc;
    char buf[BUFSIZ];

    while ((c = getopt(ac, av, "s:p:")) != EOF)
        switch (c) {
        case 's':
            svc_name = optarg;
            break;
        case 'p':
            pname = optarg;
            break;
        }

    status = papiServiceCreate(&svc, svc_name, NULL, NULL, authCB,
                            PAPI_ENCRYPT_NEVER, NULL);

    if (status != PAPI_OK) {
        printf("papiServiceCreate(%s): %s\en", svc_name ? svc_name :
                    "NULL", papiStatusString(status));
        papiServiceDestroy(svc);
        exit(1);
    }

    papiAttributeListAddInteger(&attrs, PAPI_ATTR_EXCL, "copies", 1);
    papiAttributeListAddString(&attrs, PAPI_ATTR_EXCL,
                "document-format", "application/octet-stream");
    papiAttributeListAddString(&attrs, PAPI_ATTR_EXCL,
                "job-title", "Standard Input");

    status = papiJobStreamOpen(svc, pname, attrs, NULL, &stream);
    while ((status == PAPI_OK) && ((rc = read(0, buf,
                     sizeof (buf))) > 0))
            status = papiJobStreamWrite(svc, stream, buf, rc);

    if (status == PAPI_OK)
            status = papiJobStreamClose(svc, stream, &job);


    if ((status == PAPI_OK) && (job != NULL)) {
        papi_attribute_t **list = papiJobGetAttributeList(job);

        if (list != NULL) {
            char *name = "unknown";
            int32_t id = 0;
            char *buffer = NULL;
            size_t size = 0;

            (void) papiAttributeListGetString(list, NULL,
                                    "printer-name", &name);
            (void) papiAttributeListGetInteger(list, NULL,
                                    "job-id", &id);
            while (papiAttributeListToString(list, "\en\et", buffer, size)
                            != PAPI_OK)
                buffer = realloc(buffer, size += BUFSIZ);

            printf("%s-%d:\en\et%s\en", name, id, buffer);
            free(buffer);
        }
    } else
        printf("papiJobStream*(%s-%d): %s\en", pname, id,
                    papiStatusString(status));

    papiJobFree(job);
    papiServiceDestroy(svc);

    exit(0);
}
.fi
.in -2

.SH ATTRIBUTES
.sp
.LP
See \fBattributes\fR(7) for descriptions of the following attributes:
.sp

.sp
.TS
box;
c | c
l | l .
ATTRIBUTE TYPE	ATTRIBUTE VALUE
_
Interface Stability	Volatile
_
MT-Level	Safe
.TE

.SH SEE ALSO
.sp
.LP
.BR libpapi (3LIB),
.BR papiAttributeListAddValue (3PAPI),
.BR attributes (7)
